return {
    -- mob abilities
    ['heal'] = {
        type = 'support', -- 'support' or 'attack'
        name = 'heal',
        info = 'Instantly recovers half maximum health.',
        cost = 50, -- stamina cost
        range = 1, -- cast distance
        effect = 'heal',
    },
    ['fireball'] = {
        type = 'attack',
        name = 'fireball',
        info = 'Launches a ball of flames.',
        cost = 50,
        range = 5,
        evoke = function(self, mob, game)
            if mob == game.player then
                game:pushState('target', {
                    title = 'Select target',
                    mode = 'target',
                    range = self.range,
                    finish = function(_, target)
                        if not target then return end
                        self.target = target
                        self:finish(mob, game)
                    end,
                })
            else
                if not mob.target then return false end
                self:finish(mob, game)
            end
        end,
        finish = function(self, mob, game)
            local target = self.target
            if not target then return end
            for x = target.x - 1, target.x + 1 do for y = target.y - 1, target.y + 1 do
                game.scene:putCloud(x, y, 'flame', { duration = game:roll(1, 10) })
            end end
            mob.delay = mob.delay + 10
            game.scene.animate = game.scene.animate + 10
            game.scene:passTime()
        end,
    },
    ['firebreath'] = {
        type = 'attack',
        name = 'firebreath',
        info = 'Breathe flames.',
        cost = 50,
        range = 5,
        evoke = function(self, mob, game)
            if mob == game.player then
                game:pushState('target', {
                    title = 'Select target',
                    mode = 'target',
                    range = self.range,
                    finish = function(_, target)
                        if not target then return end
                        self.target = target
                        self:finish(mob, game)
                    end,
                })
            else
                if not mob.target then return false end
                self:finish(mob, game)
            end
        end,
        finish = function(self, mob, game)
            local target = self.target
            if not target then return end

            local player = game.player

            local path = require 'game.type.line' (target.x, target.y, function(x, y)
                local feature = game.scene:getFeature(x, y)
                return game.scene.field:getCell(x, y)
                    and not feature.obscure
                    -- and not feature.obstruct
            end, { distance = self.range })
            path:compute(player.x, player.y, function(x, y)
                if x == player.x and y == player.y then return end
                game.scene:putCloud(x, y, 'flame',
                    { duration = game.rng:random(50, 100) })
            end)

            mob.delay = mob.delay + 10
            game.scene.animate = game.scene.animate + 10
            game.scene:passTime()
        end,
    },
}
